[TOC]
FMZの量子取引プラットフォームは何ができるのか?
FMZ Quant Tradingプラットフォームは,定量取引の分野で最もプロの定量コミュニティです.ここで定量戦略を学び,書き,共有,購入,販売することができます.オンラインバックテストを実施し,シミュレーション取引を行うシミュレーションボットを使用できます.また,実行,公開,ライブ取引を見ることができます.私たちはほとんどすべての主流のデジタル通貨取引所をサポートします.
トゥートリアル の 完全 シリーズ
グラフィック・チュートリアル:
Telegram グループ内の管理者に連絡してください (テレグラム基本的には,質問にすぐに答えられます.
開発支援のためのChatGPTの支援
開発支援ツールとしてChatGPTを採用しました. 開発支援ツールとして,ChatGPT 補助ツールページ.
私の戦略を実装するために利用できるプログラミング言語は?
FMZ Quant トレーディング プラットフォームは,使用をサポートしますJavaScript
, TypeScript
, Python
, C++
, Pine
Mylanguage
そしてBlockly Visualization
戦略を書き,デザインする
サポートしていますTypeScript
言語,まだそれを設定しますJavaScript
戦略を書き出すとき,// @ts-check
またはボタンをクリックします.TypeScript
戦略編集領域の右上の隅にTypeScript
プラットフォームはコードを認識します.TypeScript
自動で作成し,適切なコンパイルとタイプチェックのサポートを提供します.
TypeScript
コードを書くときに潜在的なエラーを見つけ,コードの質を改善するのに役立ちます.TypeScript
開発効率を向上させています. ソフトウェアの設計は,TypeScript
簡単に読みやすく理解できるようにします 簡単に読みやすく理解できるようにしますTypeScript
インタフェース,クラス,ジェネリックなど 強力なオブジェクト指向プログラミング機能を提供し より堅牢で再利用可能な戦略コードを書くのに役立ちますこの言語の1つしか習得する必要はありません.コードを書くことで戦略をデザインする方法をサポートすることに加えて,ビジュアルモジュール (Blockly) を使用して戦略を作成することもできます. ビジュアライゼーションモジュールスペイリングと戦略構築は,コーディングなしで,戦略をデザインするより直感的な方法を採用しています. これは,プログラムおよび定量的な取引を迅速に開始するために戦略設計に興味を培うのに非常に適しています.
Blockly
視覚化チュートリアル:
設定する
Python
インタープリターPython
戦略プログラム
戦略はPython
,バックテストやライブ取引の際に,ドッカーシステム環境が両方を持っている場合パイソン2そしてパイソン3設定することができます.Python
戦略の第"行に実行時に開始されるバージョン,例えば#!python3
そして#!python2
絶対的な経路も指定できます 例えば:#!/usr/bin/python3
.
ドッカーとは?
Docker は,複雑なデータリクエスト,データ受信,ネットワークリンク,ログポストバックなどに対して責任を負う取引戦略の実行者として理解することができます. FMZ Quant Trading プラットフォームのウェブサイトにネットワーク障害がある場合でも,Docker はサーバー上で実行されます.Linux, ウィンドウ, マック OS, アンドロイド, ラスベリーパイ ARM Linux他のシステムですドッカーページ, Linux ドッカー インストールと更新手順. ボットとログは,ドッカーによって管理されているディレクトリに保存されます./logs/storage
ファイルはSqlite
データベースファイルdb3
直接編集することができます.Sqlite
拡張子を持つファイルdb3
本物のボットデータベースでは ファイル名はボットIDです
サポートされているプロトコル
FMZ Quant Trading プラットフォームで取引戦略が開発されたとき,戦略の内容は FMZ のアカウント保有者にのみ表示されます.そして FMZ の量的な取引プラットフォームでは,戦略コードの完全なローカリゼーションを達成できます.例えば,戦略論理は,Python
戦略コンテンツのローカリゼーションが実現できるようにします.
セキュリティPython
コード:
なぜならPython
戦略は個人用ではなく,レンタル用である場合, 戦略を自分のデプロイドーカーで実行し,サブアカウントまたは完全なドーカー管理の形でレンタルすることができます.
暗号化されているPython
戦略コード:
標準ではPython
策略コードは作者が使用するときに暗号化されず 他人に貸し出されると暗号化されます
このコードを編集することでPython
戦略コードを個人使用またはレンタのために暗号化するかどうかを指定できます.Python
戦略コードの暗号化をサポートするバージョンは以下のとおりです.Python 2.7
, Python 3.5
そしてPython 3.6
.
#!python
Python インタープリタのバージョンとして,それから使用,
暗号化コマンドを入力しますencrypt
. バージョンを指定しない場合Python
追加する#!,encrypt
directly. #!python,encrypt
それとも
#!encrypt
#!python, not encrypted
それとも
#!not encrypted
コードを使用os.getenv('__FMZ_ENV__')
文字列の返信"encrypt"
本物のボットにのみ有効で,バックテストでは暗号化されません.Python
戦略コード
#!encrypt
def main():
ret = os.getenv('__FMZ_ENV__')
# If the print variable ret is the string "encrypt" or ret == "encrypt" is true, that means the encryption is valid.
Log(ret, ret == "encrypt")
FMZ Quant トレーディングプラットフォームで設定されたアカウント情報や暗号化された文字列などの機密データは,ウェブブラウザで暗号化されています. FMZ Quant トレーディングプラットフォームに格納されているすべての情報は暗号化されています (平文データではありません),ユーザーの個人デバイスのみが情報を暗号化して使用することができ,機密データのセキュリティが大幅に向上します. 戦略コード,パラメータ設定,戦略説明などに他の機密情報が含まれている場合は,戦略を公開または販売しないでください.
RSA KEY
交換の認証方法を例として,ドッカープログラムが位置するデバイス上で,機密情報をローカルに設定する方法について詳細に説明します.PKCS#8
作成には多くのツールがあります.openssl
.RSA KEY
公開鍵をアップロードしますステップ 1創造の過程でtxt
ドッカープログラムのディレクトリにある他のパス.RSA KEY
設定の編集ボックスで交換によって作成Access Key
.txt
ファイルは,同じレベルのディレクトリに配置されていますステップ3設定の編集ボックスでSecret Key
例えば,ファイル名として:rsaKey.txt
ファイルとドーカーは同じレベルのディレクトリに記入されます:file:///rsaKey.txt
. ファイルがdockerプログラムのディレクトリの隣にあるディレクトリにある場合rsa_key
記入する:file:///rsa_key//rsaKey.txt
位置を決めるならrsaKey. txt
このファイルは,ドッカーに関して同じレベルのディレクトリまたはサブディレクトリにのみ配置できるので注意してください.秘密鍵を保存するより安全になります.ビデオ説明詳細な処理のために
バックテストシステムとは何か? 何のために使われますか?
定量的な取引戦略の設計を完了した後,戦略の論理や戦略の収益の方向などの戦略の基本状況をどのように知ることができますか? もちろん,我々は実際の取引市場で戦略を実行するために直接実際のお金を使用することはできませんが,我々はあなたの戦略をテストし,歴史的なデータであなたの戦略の利益を知るために歴史的なデータを使用することができます.
バックテストシステムのデータは正確ですか? バックテストの結果の正確さは?
FMZ Quant Trading プラットフォームはバックテストシステムを実際の市場レベルそしてシミュレーションレベルリアル・マーケット・レベルは,完全な歴史的データに基づいて完全にバックテストする. シミュレーション・レベルはバックテストを生成する.tick
両方とも実際の歴史的データに基づいていますが,実際の市場レベルのデータはより正確で,結果はより信頼性があります.FMZ バックテスト メカニズムの説明しかし,バックテストは,歴史的なデータに基づいて戦略のパフォーマンスにすぎない.歴史的なデータは将来の市場を完全に表現することはできません.歴史的な市場は繰り返される可能性があります.またはブラック・スワンにつながることもあります.したがって,バックテスト結果は合理的かつ客観的に扱われるべきです.
異なるプログラミング言語戦略をバックテストする際に注意すべき事項:
バックテストJavaScriptそしてC++実際の市場ボットまたはウェックスアプリリアル市場 (つまり,ウェックスアプリFMZ Quant Tradingプラットフォームのエミュレーション交換) は,他のソフトウェア,ライブラリ,モジュールをインストールすることなく実行されます. バックテストパイソンFMZ Quant Trading プラットフォームによって追加された公共サーバーで実行され,またユーザー自身のdockerで実行することもできます.実際の市場操作とバックテストの両方がパイソンドッカーが位置するシステムにインストールされます.いくつかのライブラリが必要であれば,手動でインストールする必要があります (公共サーバーでは一般的なライブラリのみがサポートされています).
システム内のバックテストデータ
FMZ Quant Trading プラットフォームのバックテストには,シミュレーションレベルバックテストとリアル市場レベルバックテストの2種類があります.シミュレーションレベルバックテストは,シミュレーションされたバックテストを生成します.tick
各Kライン期間が12回バックテストの時間点を生成します.しかし,実際の市場レベルはticks
FMZのバックテストメカニズムは,取引戦略が単一のKラインで複数回取引できるようにし,取引が閉じる価格でのみ実行できる状況を回避する.バックテストの速度を考慮しながらより正確です.詳細な説明については,参照してくださいリンク.
バックテストシステムにおける戦略DEBUG方法
JavaScript 戦略 バックテスト Chrome DevTools のデバッグ
暗号通貨 (暗号通貨)
名前 | タイプ | 指示 |
---|---|---|
ビットフィネックス | スポット交換対象 | 限られた取引対のサポート,例えば:BTC_USD , ETH_USD そしてLTC_USD 取引対のコート通貨はUSD ドル) |
バイナンス | スポット交換対象 | 限られた取引対のサポート,例えば:BTC_USDT , ETH_USDT , ETH_BTC そしてLTC_BTC など |
OKX | スポット交換対象 | 限られた取引対のサポート,例えば:BTC_USDT , ETH_USDT , ETH_BTC そしてLTC_BTC など |
ハウビー | スポット交換対象 | 限られた取引対のサポート,例えば:BTC_USDT , ETH_USDT , ETH_BTC そしてLTC_BTC など |
OKX フューチャー | フューチャー取引対象 | 限られた取引対のサポート,例えば:BTC_USD そしてETH_USD 取引対のコート通貨はUSD 特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType 契約のコードは以下のとおりです.this_week , next_week , quarter そしてswap |
HuobiDMについて | フューチャー取引対象 | HuobiDMは Huobi Futures (Huobi Contract) で,以下のような限られた取引ペアをサポートしています.BTC_USD そしてETH_USD 取引対のコート通貨はUSD 特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType 契約のコードは以下のとおりです.this_week , next_week , quarter そしてswap . |
ビットメックス | フューチャー取引対象 | 取引相手はXBT_USD 特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType 契約のコードは次のとおりです.XBTUSD |
ビナンス・フューチャーズ | フューチャー取引対象 | 限られた取引対のサポート,例えば:BTC_USDT そしてETH_USDT 取引対のコート通貨はUSD 特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType 契約は,USDT - マージン契約; サポートされた契約コードはswap |
デリビットオプション | フューチャー取引対象 | 取引対は次のとおりです.BTC_USD そしてETH_USD 特定の契約コードの設定後 (関数を参照してください)exchange.SetContractType 契約は暗号保証契約である.特定のオプション契約コードを設定する必要があります. |
バックテストシステムにおける先物取引の場合は,戦略コードでは一時的に取引ペアを変更することがサポートされません.
バックテストは,バックテストシステムの基となるK線データに基づいて,特定のアルゴリズムに従って,与えられた基となるK線バーの最高価格,最低価格,開盤価格,閉盤価格の枠組み内でティックデータをシミュレートします.データはリアルタイムで返します.tick
インターフェースが要求されたときのデータです.詳細については,以下を参照してください:FMZ量子シミュレーションレベル バックテスト メカニズム説明.
実際の市場レベルバックテストは,実際のtick
バール時間列のレベルデータtick
実際の市場レベルバックテストでは,tick
データとは,シミュレートされたデータではなく,実際の記録データです. 深度データ,市場取引の記録データ再生,カスタム深度,および各個別取引データをサポートします. リアルマーケットレベルのデータバックテストの最大サイズは最大50MBまでであり,データセットの上限内のバックテスト時間範囲に制限はありません. バックテストの時間範囲をできるだけ拡大する必要がある場合は,深度設定ギアの値を減らすことができ,バックテストの時間範囲を増やすために各個別取引データを使用しないでください.GetDepth
,GetTrades
タイムラインの市場データで,電話GetTicker
,GetTrades
, GetDepth
そしてGetRecords
バックテストのタイムラインで時間が移動するときに,時間を複数回プッシュしない (次の市場データ瞬間へのジャンプを誘発しない).上記の機能の1つへの繰り返し呼び出しは,バックテストのタイムラインに移動するためにバックテスト時間をプッシュする (次の市場データ瞬間へのジャンプ).バックテストのために実際の市場レベルを使用する場合,以前の時間を選択することが推奨されません.早期の時間帯には実際の市場レベルのデータがない可能性があります.
市場レベルバックテストは,現在:
FMZ Quant Tradingプラットフォームのバックテストシステムのパラメータ最適化機能は,バックテスト中に各パラメータ最適化オプションに従って最適化を設定することであり,オプションは以下のように示されています.
パラメータの組み合わせを生成し,すべての組み合わせをバックテスト (すなわち,各パラメータの組み合わせを1回バックテスト) に渡る.番号バックテストシステムで最適化できます.
例えば,バックテストページのパラメータ最適化オプションを設定します:
パラメータ最適化モードのバックテスト:
戦略編集ページでは,
持ってJavaScript
ソースファイルに設定を保存します.
ソースファイルにBacktest設定を保存するJavaScript
, Python
, cpp
そしてMylanguage
:
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
ミランゲージ:
(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
platforms: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*)
システムでは,GET
バックテストのための外部データソースを取得するためにカスタム URL (公開アクセス可能な URL) を要求する方法.追加の要求パラメータは以下のとおりです.
パラメーター | 意味 | 解説 |
---|---|---|
シンボル | シンボルの名前 | BTC_USD_OKCoin_EN など |
イード | 交換 | OKCoin_EN など |
丸い | 価格の正確性 | 返したデータに表示される価格を 1000 で掛け,丸める必要があります. |
周りに | 量 の 正確性 | 返されたデータに含まれる金額は100で掛け,丸める必要があります. |
期間 | バールピリオド (ミリ秒) | "分を要求するバーを表示します |
深さ | 深度レベル | 1-20 |
ビジネス | データを分割する必要性 | true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false true/false |
について | 開始時間 | UNIX タイムスタンプ |
ありがとうございました | 終わり の 時 | UNIX タイムスタンプ |
注記:
Round and V-Round are two parameters designed to avoid losing the precision of floating-point numbers during network transmission. The price data, trading volume and order amount, are all transmitted using integers.
縫ったデータの一例:
http://customserver:80/data?symbol=BTC_USD_OKCoin_EN&eid=OKCoin_EN&round=3&vround=3&period=900000&from=1564315200&to=1567267200
返された形式は次の2つの形式の1つでなければならない (システムによって自動的に認識される):
普通のバーレベルバックテスト
{
"schema":["time","open","high","low","close","vol"],
"data":[[1564315200000,9531300,9531300,9497060,9497060,787],[1564316100000,9495160,9495160,9474260,9489460,338]]
}
Tickレベルバックテストデータ (市場深度情報を含む,深度フォーマット [価格,ボリューム] の配列.複数の深度レベルがある可能性があります.
Asks は価格上昇順序,そして Bids は価格逆順序を指します.)
{
"schema":["time","asks", "bids","trades","close","vol"],
"data":[[1564315200000,[[9531300,10]], [[9531300,10]],[[1564315200000,0,9531300,10]],9497060,787]]
}
記述
フィールド | 記述 |
---|---|
スキーマ | データ配列の列の属性を指定し,文字が小さいため, |
データ | スキーマによるデータを格納する配列 |
データ形式
フィールド | 記述 |
---|---|
要求/申し出 | [価格,量...] |
取引 | [時間,方向性 (0:買い,1:売る),価格,数量...] |
資金提供率のデータ提供:
例えば,Binance Futuresのバックテストを行うとき,カスタムデータソースによって提供される資金提供率の追加のデータが必要です.例えば,Binance Futuresのバックテスト中に要求された資金提供率のデータ構造は以下のとおりです.
{
"detail": {},
"symbol": "futures_binance.eth_usdt.funding",
"schema": ["time", "open", "high", "low", "close", "vol"],
"data": [
[1582876800000, 25289, 25289, 25289, 25289, 0],
[1582905600000, 30522, 30522, 30522, 30522, 0],
[1582934400000, 40998, 40998, 40998, 40998, 0],
...
[1626652800000, 198, 198, 198, 198, 0],
[1626681600000, 691, 691, 691, 691, 0], // The adjacent periodic interval is 8 hours
[1626710400000, 310, 310, 310, 310, 0], // The funding rate of Binance updates every 8 hours, and why the data of the funding rate turns out to be 310?
[1626739200000, 310, 310, 310, 310, 0], // Like the bars data, to avoid losing the precision of floating-point numbers during network transmission, the data uses integer, so the data needs to be processed according to round parameter; the data, returned to the backtest system after processing, is 310
[1626768000000, -41610, -41610, -41610, -41610, 0], // The funding rate might be a negative value
[1626796800000, -5125, -5125, -5125, -5125, 0],
...
[1627977600000, 10000, 10000, 10000, 10000, 0]
]
}
バックテストシステムからのデータ要求の例:
http://customserver:80/data?symbol=futures_binance.eth_usdt.funding&eid=Futures_Binance&round=8&vround=5&depth=20&trades=1&custom=0&period=3600000&from=1360771200&to=1628006400
カスタムデータソースの例:
データ源,URLを指定するhttp://xxx.xx.x.xx:9090/data
データベースをカスタマイズします.
package main
import (
"fmt"
"net/http"
"encoding/json"
)
func Handle (w http.ResponseWriter, r *http.Request) {
// e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data
// r.URL: /data?depth=20&detail=true&eid=Binance&from=1566820800&period=900000&round=3&symbol=BTC_USDT_Binance&to=1569686400&trades=1&vround=5
// response
defer func() {
// response data
/* e.g. data
{
"schema":["time","open","high","low","close","vol"],
"data":[
[1564315200000,9531300,9531300,9497060,9497060,787],
[1564316100000,9495160,9495160,9474260,9489460,338]
]
}
*/
ret := map[string]interface{}{
"schema" : []string{"time","open","high","low","close","vol"},
"data" : []interface{}{
[]int64{1564315200000,9531300,9531300,9497060,9497060,787},
[]int64{1564316100000,9495160,9495160,9474260,9489460,338},
},
}
b, _ := json.Marshal(ret)
w.Write(b)
}()
}
func main () {
fmt.Println("listen http://localhost:9090")
http.HandleFunc("/data", Handle)
http.ListenAndServe(":9090", nil)
}
テスト戦略JavaScript
例:
/*backtest
start: 2019-07-28 00:00:00
end: 2019-07-29 00:00:00
period: 1m
platforms: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
*/
function main() {
var ticker = exchange.GetTicker()
var records = exchange.GetRecords()
Log(ticker)
Log(records)
}
バックテストシステム内のカスタムデータによって描かれたチャート:
戦略 印刷情報:
FMZ Quant トレーディングプラットフォームは,JavaScript
翻訳とPython
ローカルバックテストエンジンのバージョン,サポート設定基となるK線期バックテスト中に
戦略
鍵を使うCtrl +,
キーを押して ページに戻るCtrl
キーを押して,
.
節約戦略のショートカットキー
鍵を使うCtrl + s
戦略を救うために
戦略バックテストを開始するためのショートカット
鍵を使うCtrl + b
機能名 | 記述 |
---|---|
main() |
これは入力関数です. |
onexit() |
通常終了時,最大実行時間は5分であり,未申告のまま残すことができます.タイムアウトが発生した場合,中断するエラーが報告されます. |
onerror() |
実行時間は5分で,宣言されないまま残すことができます.Python そしてcpp この機能をサポートしません. |
init() |
実行開始時に自動的に呼び出されます. 宣言されないまま残すこともできます. |
onerror()
.onerror()
ボットで起動します.onexit()
触発されることはありませんonexit()
処理作業は,最大5分で,使用者が実現します.
function main(){
Log("Start running, stop after 5 seconds, and execute onexit function!")
Sleep(1000 * 5)
}
// onexit function implementation
function onexit(){
var beginTime = new Date().getTime()
while(true){
var nowTime = new Date().getTime()
Log("The program stops counting down..The cleaning starts and has passed:", (nowTime - beginTime) / 1000, "Seconds!")
Sleep(1000)
}
}
import time
def main():
Log("Start running, stop after 5 seconds, and execute onexit function!")
Sleep(1000 * 5)
def onexit():
beginTime = time.time() * 1000
while True:
ts = time.time() * 1000
Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!")
Sleep(1000)
void main() {
Log("Start running, stop after 5 seconds, and execute onexit function!");
Sleep(1000 * 5);
}
void onexit() {
auto beginTime = Unix() * 1000;
while(true) {
auto ts = Unix() * 1000;
Log("The program stops counting down..The cleaning starts and has passed:", (ts - beginTime) / 1000, "Seconds!");
Sleep(1000);
}
}
ユーザが初期化関数を実装するinit()
自動で実行します.init()
初期化タスクを完了する戦略の開始時に
function main(){
Log("The first line of the code executed in the program!", "#FF0000")
Log("Exit!")
}
// Initialization Function
function init(){
Log("Initialization!")
}
def main():
Log("The first line of the code is executed!", "#FF0000")
Log("Exit!")
def init():
Log("Initialization!")
void main() {
Log("The first line of the code is executed!", "#FF0000");
Log("Exit!");
}
void init() {
Log("Initialization!");
}
機能の実行onerror()
この機能は,Exception が発生すると起動します.Python
そしてcpp
.
function main() {
var arr = []
Log(arr[6].Close)
}
function onerror() {
Log("error")
}
# not supported by python
// not supported by C++
戦略はJavaScript
, Python
そしてcpp
についてSleep()
この機能は,これらの戦略のメインループで呼び出す必要があります. バックトラッキング速度を制御するために使用されます. ボットでは,戦略投票間隔を制御するために使用されます. また,交換のAPIインターフェースにアクセスする要求頻度を制御します.
仮想通貨戦略の基本枠組み例:
function onTick(){
//Write strategy logic here, and it will be called constantly, such as printing market information
Log(exchange.GetTicker())
}
function main(){
while(true){
onTick()
//The function "Sleep" is mainly used to control the polling frequency of cryptocurrency strategies to prevent accessing the exchange API interafce too frequently
Sleep(60000)
}
}
def onTick():
Log(exchange.GetTicker())
def main():
while True:
onTick()
Sleep(60000)
void onTick() {
Log(exchange.GetTicker());
}
void main() {
while(true) {
onTick();
Sleep(60000);
}
}
100の価格と 1の量で毎秒取引所で購入オーダーをします. これを次のように書きます.
function onTick(){
// It is just an example; for all the assets will be used to place orders fast during backtest or in the bot, do not implement the example in the bot
exchange. Buy(100, 1)
}
function main(){
while(true){
onTick()
// The pause period can be customized in millisecond (1 second = 1000 milliseconds)
Sleep(1000)
}
}
def onTick():
exchange.Buy(100, 1)
def main():
while True:
onTick()
Sleep(1000)
void onTick() {
exchange.Buy(100, 1);
}
void main() {
while(true) {
onTick();
Sleep(1000);
}
}
についてテンプレートライブラリFMZ Quant Trading プラットフォームの再利用可能なコードモジュールで,取引戦略コードのカテゴリとして動作します.テンプレートライブラリ,当面 FMZ Quant Trading プラットフォームにログインしているアカウントの"戦略"ページにテンプレートが追加されます.作成後,カテゴリーを通常の戦略に変更することはもはやできません.
テンプレートライブラリJavaScript
:
テンプレートライブラリPython
:
テンプレートライブラリcpp
:
/*
-- This method is called directly with $.Test() after the strategy refers to the template
-- The "main" function will not be triggered in the strategy, and it is only used as the entry point for template debugging
*/
$.Test = function() {
Log('Test')
}
function main() {
$.Test()
}
def Test():
Log("template call")
# Export "Test" function; the main strategy can be called by ext.Test()
ext.Test = Test
// The strategy refers to the template and calls this method directly with ext::Test()
void Test() {
Log("template call");
}
テンプレートライブラリコード:
$.SetParam1 = function(p1) {
param1 = p1
}
$.GetParam1 = function() {
Log("param1:", param1)
return param1
}
def SetParam1(p1):
global param1
param1 = p1
def GetParam1():
Log("param1:", param1)
return param1
ext.SetParam1 = SetParam1
ext.GetParam1 = GetParam1
void SetParam1(float p1) {
param1 = p1;
}
float GetParam1() {
Log("param1:", param1);
return param1;
}
戦略コードを参照してください.テンプレートライブラリ上記の例:
function main () {
Log("call $.GetParam1:", $.GetParam1())
Log("call $.SetParam1:", "#FF0000")
$.SetParam1(20)
Log("call $.GetParam1:", $.GetParam1())
}
def main():
Log("call ext.GetParam1:", ext.GetParam1())
Log("call ext.SetParam1:", "#FF0000")
ext.SetParam1(20)
Log("call ext.GetParam1:", ext.GetParam1())
void main() {
Log("call ext::GetParam1:", ext::GetParam1());
Log("call ext::SetParam1:", "#FF0000");
ext::SetParam1(20);
Log("call ext::GetParam1:", ext::GetParam1());
}
引用
戦略編集ページのテンプレート列の参照を確認した後,戦略を保存します.
Exchange
交換オブジェクトとして考えることができる.デフォルトでは,戦略パラメータに追加された最初の交換オブジェクトとして考えられる. 交換とのすべてのデータ相互作用は,このオブジェクトの機能を通じて実現される.
追加された交換対象は,exchange
コード内のオブジェクト:
function main() {
Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
}
def main():
Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel())
void main() {
Log("The name of the first exchange object added on the bot page or backtest page:", exchange.GetName(), ", Label:", exchange.GetLabel());
}
すべての交換オブジェクトを格納する配列として理解できますexchange
交換オブジェクト,複数の交換オブジェクトを含むことができる.exchanges[0]
はexchange
.
追加された交換対象は,exchanges[0]
, exchanges[1]
, exchanges[2]
...戦略コードなどです
function main() {
for(var i = 0; i < exchanges.length; i++) {
Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
}
}
def main():
for i in range(len(exchanges)):
Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel())
void main() {
for(int i = 0; i < exchanges.size(); i++) {
Log("Index of the exchange object added (the first one is 0 and so on):", i, "Name:", exchanges[i].GetName(), "Label:", exchanges[i].GetLabel());
}
}
属性Status
についてOrder
structure.
常数名 | 定義 | 価値 |
---|---|---|
ORDER_STATE_PENDING について | 未完成 | 0 |
ORDER_STATE_CLOSED について | 終わった | 1 |
ORDER_STATE_CANCELED 削除しました | キャンセル | 2 |
ORDER_STATE_UNKNOWN オーダー_ステート_未知 | 未知の状態 (他の状態) | 3 |
ORDER_STATE_UNKNOWN オーダー_ステート_未知ステータスは呼び出すことができますexchange.GetRawJSON()
オリジナルの注文状態情報を取得し,交換ファイルをクエリし,特定の説明を表示します.
形式の定数名は,戦略コードで直接使用され,属性と比較できます.Status
についてOrder
定数名を印刷すると,定数値が表示されます.常数名そしてそれに対応する値同じように動作するので,これ以上詳細な説明はありません.
属性Type
についてOrder
structure.
常数名 | 定義 | 価値 |
---|---|---|
ORDER_TYPE_BUY について | 購入命令 | 0 |
ORDER_TYPE_SELL について | 販売命令 | 1 |
属性Type
についてPosition
structure.
常数名 | 定義 | 記述 | 適用可能 | 価値 |
---|---|---|---|---|
PD_LONG | ロングポジション | 暗号通貨の先物使用exchange.SetDirection("closebuy") 閉じるポジションの方向を設定し,このタイプのポジションを閉じる |
仮想通貨先物 | 0 |
PD_SHORT | ショートポジション | 暗号通貨の先物使用exchange.SetDirection("closesell") 閉じるポジションの方向を設定し,このタイプのポジションを閉じる |
仮想通貨先物 | 1 |
属性Offset
についてOrder
structure.
常数名 | 定義 | 価値 |
---|---|---|
ORDER_OFFSET_OPEN について | オープン・ポジション・オーダー | 0 |
ORDER_OFFSET_CLOSE について | クローズ・ポジション・オーダー | 1 |
取引戦略コードでは,戦略インターフェースに設定された戦略パラメータがグローバル変数として反映されます.JavaScript
戦略インターフェースで設定または修正されたパラメータ値に直接アクセスできます.Python
戦略はキーワードですglobal
戦略の全体的な変数を修正するために必要である.
パラメータタイプ:
変数 | 記述 | コメント | タイプ | デフォルト値 | 記述 |
---|---|---|---|---|---|
番号 | 数字型 | コメント | 番号 (番号) | 1 | C++の戦略は浮動点字タイプです |
文字列 | 文字列 | コメント | 文字列 (文字列) | こんにちは FMZ | デフォルト値は引用する必要はありません.入力は文字列として扱われます. |
コムボックス | コンボボックス | コメント | コムボックス (選択) | 1|2|3 | コムボックス変数自体は数値値で,コムボックスコントロールが選択した列のインデックスを表します.最初のコムボックスは1で,他のコムボックスは0で, |
ボール | チェックオプション | コメント | ブール式 (真/偽) | 本当 | チェックされている場合,変数 bool は true; チェックされていない場合,変数 bool は false |
秘密文字列 | 暗号化された文字列 | コメント | 暗号化された文字列 (文字列) | パスワード | 文字列と同じ使い方で,暗号化された文字列は暗号化によって送信され,文字列で送信されません. |
number
, string
, combox
, bool
, secretString
.パラメータ依存性設定:
パラメータの選択に基づいて,別のパラメータが表示され,隠されるように設定することができます. たとえば,パラメータを設定します.numberA
この式は,数式で,numberA
パラメータが表示されるか隠されるかisShowA
変数を true と false にします.numberA
インターフェースパラメータについて:numberA@isShowA
.
このパラメータは,isShowA
パラメータがチェックされていない場合numberA
パラメータの値がコンボボックスの制御タイプに等しいかどうかを判断する,パラメータの依存部分です.インデックス値同じように,パラメータを取ります.isShowA
パラメータに変数を設定すると,numberA@combox==2
パラメータnumberA
パラメータが表示されるか隠されるかcombox
第3のオプションとしてチェックされます (インデックス0は第1のオプション,インデックス1は第2のオプション,インデックス2は第3のオプションです)
戦略インターフェースパラメータ,インタラクティブなコントロール,パラメータグループ機能の(?First group)
グループ化を開始するパラメータの説明の初め,次の図のように:
戦略を使用する場合は,パラメータはグループで表示されます:
パラメータのデフォルト値を保存:
バックテスト中に,戦略パラメータのデフォルト値を保存したい場合は,Save settings
戦略パラメータを変更した後にボタンを押します.
戦略パラメータ設定をコードで保存できます:
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
'''backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
'''
/*backtest
start: 2020-02-29 00:00:00
end: 2020-03-29 00:00:00
period: 1d
args: [["number",2],["string","Hello FMZ.COM"],["combox",2],["bool",false],["numberA@isShowA",666],["isShowA",true]]
*/
いくつかの機能には,オリジナルのJSON
呼び出し中に要求されたデータです.JSON
データが属性に格納されているInfo
バックテストはプラットフォームインターフェースにアクセスしないため,バックテスト中に返されたデータは属性がないInfo
以下は各データ構造の主要な属性の説明です.
すべての取引履歴を取得 (自分自身ではなく),関数によって返されるexchange.GetTrades()
.
{
Id : 9585306, // Trading record ID; if the exchange interface does not provide order ID, use the timestamp to fill in
Time : 1567736576000, // Time (Unix timestamp milliseconds)
Price : 1000, // Price
Amount : 1, // Volume
Type : 0 // Order Type; refer to the order type in the constants; 0 is ORDER_TYPE_BUY, meaning the value of ORDER_TYPE_BUY is 0
}
市場コートは,関数で返される.exchange.GetTicker()
.
{
Info : {...}, // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
High : 1000, // Highest price; if the platform interface does not provide the 24-hour highest price, use sell price 1 to fill in
Low : 500, // Lowest price; if the platform interface does not provide the 24-hour lowest price, use buy price 1 to fill in
Sell : 900, // Sell price 1
Buy : 899, // Buy price 1
Last : 900, // Last executed price
Volume : 10000000, // Recent trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
Time : 1567736576000 // Millisecond-level timestamp
}
標準OHLC
構造は,K線とプロセス指標の計算と分析を描くために使用されます.exchange.GetRecords()
構造の配列を返します.Record
構造は1つのk線バーを表します.BAR
.....Time
についてRecord
K線バーピオードの開始時間です.
{
Time : 1567736576000, // A timestamp, accurate to millisecond, in the same format as the result obtained by Javascript's newDate().GetTime()
Open : 1000, // Open price
High : 1500, // Highest price
Low : 900, // Lowest price
Close : 1200, // Close price
Volume : 1000000 // Trading volume; in principle, the unit of spot trading volume is base currency, and the unit of futures trading volume is contract quantity. If the platform interface does not provide this kind of data, use the existing data of the platform interface to fill in; for instance, it might be a trading volume in the unit of quote currency
}
命令構造は,関数によって返される.exchange.GetOrder()
そしてexchange.GetOrders()
機能についてexchange.GetOrders()
構造の配列または空の配列を返します (配列がない場合)現在の未完成の注文返信する[]
(つまり,空の配列)
{
Info : {...}, // After requesting the platform interface, this attribute is not available in the raw data that the exchange interface responds to, during the backtest
Id : 123456, // Unique ide